Grandia Ii, hehehehe....
geminimewtwo
  Inviato il: 25-06-2003, 17:56


Membro Junior


Gruppo: Socio


Messaggi: 1062
Utente Nr.: 3611
Iscritto il: 04-08-2001
Stato: offline



Spiegazione (è tanto che non lo faccio più, spero di ricordarmi):
Le zone di dati compresse sono divise in blocchi di dimensioni fisse di 8 byte precedute da un byte di riconoscimento.
La compressione è del tipo "Questo dato non è compresso, stampalo in output così com'è, se invece e compresso, recupera il byte salto-lunghezza e ricicla i dati già decompressi".
Per riconoscere nei vari banchi quali dati sono compressi e quali no si usa il riconoscitore. Questo byte viene scomposto in 8 bit, ad ogni bit corrisponde un byte non compresso o un byte compresso salto-lunghezza.
Il funzionamento del byte di riconoscimento in Grandia II è simile a quello di FF7 (con qualche variazione).
Faccio un esempio (almeno evito la barba di spiegare tutto nei minimi dettagli):
Piccola legenda dei colori:
-Blu: Riconoscitore
-Nero: Dato NON compresso
-Rosso: Dato compresso
14 2030405060708090
Nota: I dati sono puramente casuali, affonterò dopo un caso reale.
Procediamo per passi. Sappiamo che 14 è il byte di riconoscimento (è sempre a capo della sequenza del banco, quindi non ci si può sbagliare). Come fare ad identificare quali byte dopo sono compressi e quali no? Semplice, convertendo 14 in binario, quindi verrà fuori 00010100. Leggiamo questa sequenza da destra verso sinistra e assegnamo progressivamento ogni byte a ciò che c'è nel banco dei dati. Abbiamo 0 e 0, quindi due dati non compressi, poi subito 1, quindi un byte salto-lunghezza, 0 cioè altro dato non compresso, 1 altro dato compresso, quindi tre 0 cioè ultimi 3 byte non compressi.
E i riconoscitori sono fuori, ora tocca ai byte compressi...

Esempio preso realmente dai dati:
18 656E2064A0696D70 (Versione testuale: .en d.imp)
L'identificazione già l'ho fatta dai colori, quindi passo direttamente a farvi capire come funzionano i dati compressi. In questo caso abbiamo prima 64, dopo A0, però è meglio lasciarli distinti.
Come prima cosa, scomponiamo il numero in bit, quindi 64 sarà 01100100, separando i primi 6 bit dagli ultimi due, in questo modo:
011001<->00
Per ricavare il salto prendiamo i 6 bit a sinistra e riconvertiamo in decimale sommando 1, dovrebbe uscire 26. Per la lunghezza del recupero invece basta trasformare le cifre binarie a destra in decimale e sommare 2, quindi 0+2=2.
Ora non resta che saltare indietro di 26 byte nello stream di output decompresso, copiare 2 byte, spostarsi alla fine del flusso output e incollare quel che è stato ripescato.
Stesa procedura con A0, 101000<->00, somma di 2 sui byte di destra. Quindi in questo caso il salto sarà di 41 con recupero di 2 byte.
Il massimo del salto possibile è 64, il massimo recupero è 5.

Fine smile.gif (spero di non aver scritto cappellate, purtroppo andavo di fretta biggrin.gif )

NOTA IMPORTANTISSIMA: I dati compressi non iniziano con l'inizio del file passato da Mentz, stanno un po' più giù, quindi c'è necessità di saltare qualcosa per trovare il primo riconoscitore ed iniziare la decompressione effettiva.

--------------------
user posted image

Chiuso per ferie dal 27 Giugno ore 23:00 fino al 18 Luglio ore 14:00.
Grazie per l'attesa gentile cliente.
Se le dovesse servire assistenza nel frattempo, si registri e lasci un messaggio qui.
 
     Segnala messaggio ad un moderatore  Top